//
//  DataManager.h
//  iFlickr
//
//  Created by 张 霄鹤 on 09-5-31.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//


#import <Foundation/Foundation.h>

#import "RESTClient.h"

#import "PhotosetInfo.h"

#import "UserInfo.h"

#import "DocumentBuilder.h"

#import "Document.h"

#import "UploadItem.h"

#import "BlogInfo.h"



#define PARSE_RSP_FAILD 1

#define PARSE_RSP_OK 2

#define PARSE_RSP_NO_RSP 3

@interface DataManager : NSObject {
	
	/**
	 * API_KEY  32fdd35bca5b784340c0bdf523b9d3cc 
	 */
	NSString *apiKey;
	
	/**
	 * secret key fe8a457a3077648b
	 */
	NSString *secretKey;
	/**
	 * Frob
	 */
	NSString *frob;
	
	NSString *desc;
	
	//FlickrParser *fparser;
	
	UserInfo *userInfo;
	
	NSMutableArray *uploadItems;
	
	NSMutableArray *userBlogs;
	
	DocumentBuilder *domBuilder;
	
	RESTClient *rest;
}

+(id) sharedDataManager;

+(id) alloc;

-(id)initWithApikeyAndSecret:(NSString *)api_key secret:(NSString *)key;

/**
 * 检查 doc 中是否包含 <rsp stat=""> 标记，并且察看 stat 属性
 */
-(int)isRspFail:(Document *)doc;

/**
 * 创建默认参数，添加 api_key
 */
-(NSMutableDictionary *)initParams;

///**
// * 执行远程请求
// */
//-(id)invokeRemoteMethod:(NSString *)url withMethod:(NSString *)method params:(NSDictionary *)param;

/**
 * 请求REST
 */
-(id)invokeRESTMethod:(NSString *)method params:(NSDictionary *)param;

/**
 *  获取frob并且生成授权地址
 */
-(NSURL *) getFrobAndAuthURL;

/**
 * 计算 api_sig 同时，会检查 是否添加了 api_key ，如果没有则添加
 */
-(NSString *)genApiSign:(NSString *)method params:(NSDictionary *)paramDict;

-(NSString *)genApiSign:(NSString *)method params:(NSDictionary *)paramDict addMethod:(BOOL)badd;

#pragma mark -
#pragma mark 登录信息

-(NSString *)getFrobFromServer;

-(NSString *)getUserToken;

-(BOOL)saveAuthInfo:(NSDictionary *)info;

-(BOOL)loadAuthInfo;

-(BOOL)isAuthorized;

-(void)logout;

#pragma mark -
#pragma mark 上传信息

/**
 * 保存对象到文件
 */
-(BOOL)saveObjectToFile:(id)items withName:(NSString *)path;
/**
 * 加载对象
 */
-(id)loadObjectFromFile:(NSString *)path;

/**
 * 保存没有上传的图像信息
 */
-(void)saveUnfinishItems;
/**
 * 装载没有上传的图像信息
 */
-(void)loadUnfinishItems;

#pragma mark -
#pragma mark AppDocumentPath
/**
 Returns the path to the application's documents directory.
 */
- (NSString *)applicationDocumentsDirectory ;

#pragma mark -
#pragma mark uploadPhoto

/**
 * 添加图像
 */
-(void)notifyUploadItem:(UploadItem *)item;

/**
 * 获取上传图像内容
 */
-(NSArray *)getUploadItems;

/**
 * 删除指定索引的图像信息
 */
-(BOOL)removUploadItemAt:(NSInteger)index;
/**
 * 获取指定位置的UploadItem
 */
-(UploadItem *)getUploadItemAt:(NSInteger)index;

- (NSInteger)getUploadItemCount;

/**
 * 上传图像到服务器，返回 photoid 或者是 错误信息
 * @param data 图像二进制数据
 * @param params 图像描述信息
 * @return id photoid 或者是错误信息
 */
-(id)uploadImageToServer:(NSData *)data withParams:(NSDictionary *)params;

-(NSData *)convertMultipart:(NSDictionary *)params withDesc:(NSString *)de;

#pragma mark -
#pragma mark SharePhotos

/**
 * 通过用户ID，以及图像ID来获取图像地址
 */
-(NSString *) getPhotoURL:(NSString *)nsid withID:(NSString *)photoid;

/**
 * 通过网络连接
 */
-(UIImage *)loadPhotoWithURL:(NSURL *)url;

#pragma mark -
#pragma mark Photoset

/**
 * 获取指定用户的照片集
 * 返回结果中 保存的是 PhotosetInfo 类型
 */
-(NSArray *) getPhotosetsByID:(NSString *)nsid;

/**
 * 将photoID 添加到 照片集中
 */
-(BOOL)addPhotoToSet:(NSString *)photoID toSet:(NSString *)setID;

/**
 * 通过参数进行照片集的创建
 * @param params 照片集的描述信息，其中必须包括 title, primary_photo_id , 可以包括 description
 * @return id 如果成功返回 PhotosetInfo, 如果失败返回 NSError
 */
-(PhotosetInfo *) createPhotoset:(NSDictionary *)params;

/**
 * 获取没有在Photoset中的图片
 * 调用 flickr.photos.getNotInSet
 * 此方法需要使用 读取 权限
 * 参数 只有 api_key是必须的
 */
-(NSArray *) getNotInSets;

/**
 * 获取指定数量的Tag
 *
 */
-(NSArray *) getHotTag:(NSInteger)num;


#pragma mark -
#pragma mark UserInfo
/**
 * 获取当前注册用户的ID
 */
-(NSString *) currentUserID;

/**
 * 获取当前登录的用户名
 * @return NSString name
 */
-(NSString *) currentUserName;


#pragma mark -
#pragma mark Photo Search

/**
 * 搜索图片
 * 根据 params 的不同参数，进行相应功能的搜寻
 * 成功 返回 NSArray
 * 失败返回 NSError
 */
-(id)searchPhoto:(NSMutableDictionary *)params;


#pragma mark -
#pragma mark Blog

/**
 * 获取当前用户的博客列表
 */
- (id)getBlogListFromServer;

/**
 * 获取博客列表
 */
- (NSArray *)getBlogList;

/**
 * 获取指定索引的元素
 */
- (BlogInfo *)getBlogAtIndex:(NSInteger)index;

/**
 * 获取博客列表数量
 */
- (NSInteger)getBlogsCount;

/**
 * 将图片提交到博客中
 * @param params 包含了提交的参数，其中，必须包括 photo_id, title, description,
 *               可选内容 blog_id, blog_password, service
 * 参数说明
 *        photo_id 图片id，上传之后获取
 *        title    图片标题
 *        description 图片描述
 *        blog_id 目标博客，这个需要在flickr.com 中注册博客，才会显示出来
 *        blog_password 目标博客的密码，这个需要用户输入
 *        service 如果 blog_id 不输入，那么就提交到 指定 service 中的第一个 blog 
 */
- (id)postPhotoToBlog:(NSDictionary *)params;


/**
 * 利用错误码与错误信息创建 NSError
 */
-(NSError *)makeError:(NSInteger)code withMessage:(NSString *)msg;



@end
